<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // promise方法

    // 一 实例方法
    // 1.catch 捕捉promise链式调用的错误

    // 单个 promise对象
    // let p = new Promise((resolve, reject) => {
    //   // resolve(111);
    //   reject("error");
    // })
    // p.then(res => {
    //   console.log(res)
    // }).catch(err => {
    //   console.log(err);
    // })

    // 多个  promise 对象
    // function fn1 () {
    //   return new Promise((res, rej) => {
    //     setTimeout(() => {
    //       res(1)
    //       // rej('错误')
    //     }, 1000)
    //   })
    // }
    // function fn2 (){
    //   return new Promise((res,rej)=>{
    //     setTimeout(()=>{
    //       // res(2)
    //       rej('错误')
    //     },1000)
    //   })
    // }
    // function fn3 (){
    //   return new Promise((res,rej)=>{
    //     setTimeout(()=>{
    //       res(3)
    //       // rej('错误')
    //     },1000)
    //   })
    // }

    // fn1().then(res=>{
    //   console.log(res);
    //   return fn2()
    // }).then(res=>{
    //   console.log();
    //   return fn3()
    // }).then(res=>{
    //   console.log(res);
    // }).catch(err => console.log('catch' , err))




    // 2.finally  无论成功或者失败都会最后执行 promise执行之后再调用
    // 无论成功或失败都会最后执行
    // fn1().finally(() => {
    //   console.log("执行完了");
    // })




    // 二 静态方法
    // 3.  Promise.resolve() 快速创建一个成功状态的promise对象
    // 原生
    // let p1 = new Promise(resolve=>{
    //   resolve('原生promise')
    // })

    // let p1 = Promise.resolve('用静态方法创建')
    // console.log(p1);


    // 4.  Promise.reject()  快速创建一个失败状态的promise对象
    // let p2 = new Promise((resolve,reject)=>{
    //   reject('err')
    // }).catch(err => console.log('err'))

    // let p2 = Promise.reject('err').catch(err => console.log('err'))
    // console.log(p2);


    // 5.  Promise.race()  参数:可迭代对象 类似于数组
    //  执行多个promise对象 获取执行最快的promise对象的结果
    // 返回值 第一个promise对象执行完成的结果

    // let p3 = new Promise((res,rej)=>{
    //   setTimeout(()=>{
    //     res('成功le ')
    //   },1000)
    // })
    // let p4 = new Promise((res,rej)=>{
    //   setTimeout(()=>{
    //     rej(222)
    //   },1000)
    // })
    // let p5 = new Promise((res,rej)=>{
    //   setTimeout(()=>{
    //     res('成功')
    //   },3000)
    // })
    // Promise.race([p3,p4,p5]).then(res=>{
    //   console.log(res);
    // }).catch((err)=> console.log(err, '失败了'))


    // 6.  Promise.all()  参数:iterable 类型  返回值 一个promise实例
    // 可以执行多个promise对象 可以收集所有peomise对象的结果 但promise对象必须都是fulfilled状态
    // 有失败状态的promise实例 就会报错

    // let p3 = new Promise((res,rej)=>{
    //   setTimeout(()=>{
    //     res('成功le ')
    //   },1000)
    // })
    // let p4 = new Promise((res,rej)=>{
    //   setTimeout(()=>{
    //     res(222)
    //   },1000)
    // })
    // let p5 = new Promise((res,rej)=>{
    //   setTimeout(()=>{
    //     res('成功')
    //   },3000)
    // })
    // Promise.all([p3,p4, p5]).then(res=>{
    //   console.log(res);
    // })




    // 7.  Promise.allSettled()   参数: 可迭代的对象
    // 可以执行多个promise对象 可以获取promise对象的fulfilled或rejected状态的结果  并带有一个对象数组，每个对象表示对应的 promise 结果。
    // 返回值:  每个promise对象的执行结果 存放在一个数组中

    let p3 = new Promise((res, rej) => {
      setTimeout(() => {
        res('成功le ')
      }, 1000)
    })
    let p4 = new Promise((res, rej) => {
      setTimeout(() => {
        rej(222)
      }, 1000)
    })
    let p5 = new Promise((res, rej) => {
      setTimeout(() => {
        res('成功')
      }, 3000)
    })
    Promise.allSettled([p3, p4, p5]).then(res => {
      console.log(res);
    }).catch((err) => console.log(err, '失败了'))

  </script>
</body>

</html>